﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using System.Data;
using produccion.reportes;
using System.Windows.Controls.Primitives;
using System.Threading;
using System.Globalization;
using System.Collections;
using System.Reflection;
using System.Runtime.InteropServices;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FrmAyudasGenericas.xaml
    /// </summary>
    public partial class FrmAyudasGenericas : Window
    {
        #region FJRF - Variables
        MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Para traer todas las funciones
        DataTable DtInformacionConsultada = new DataTable();//FJRF - Para crear la tabla que contendra la ayuda generica
        DataTable DtFiltrarInformacionConsultada = new DataTable();//FJRF - Para crear la tabla que contendra la ayuda generica filtrada
        DataTable DtDatosSeleccionado = new DataTable();//FJRF - Para igualar la tabla del dato seleccionado no importando de que datatable venga

        public DataTable pDtDatosRecibidosConInformacion;//FJRF - Este datatable es para recibir datos ya armados y no usar la consulta

        public DataTable DtDatosRetornados = new DataTable();//FJRF - Para crear la tabla el datable que retorna

        public String pStrConsultaSql_Obligatorio;//FJRF - Variable para la consulta que se enviara al formulario
        public String pStrBuscarPorDefectoEnElCampo_Opcional;//FJRF - Variable que se usara para poner el campo de busqueda por defecto
        public String pStrTituloVentana_Opcional;//FJRF - Titulo de la ventana si no tiene nada pone el titulo por defecto
        public String pStrCampoCodigoDeLaTabla_Obligatorio;//FJRF - Campo llave por el dato que se buscara

        public String pStrNombreColumnasParaFormatoNumericoSeparadoPorComas_Opcional;//FJRF - Son las columnas que tendran un formato de numero

        public Boolean pBooQuitarBotonRetornar_Opcional = false;//FJRF - Para quitar el boton de retornar datos por si acaso solo se usa el formulario para hacer consultas visuales sin que retorne datos
        public Boolean pBooPonerBotonExportarExcel_Opcional = false;//FJRF - Para quitar el boton de exportar los datos a excel

        public int pIntNumeroColumnasAInmovilizarGrid_Opcional = 0;//FJRF - Para inmovilizar las columnas del grid
        String StrDataTableCargado;//FJRF - Para saber por donde se esta buscando los datos
        
        String StrSalioPor = "";//FJRF - Para saber por donde salio (La iniciamos por defecto vacia)
        #endregion

        public FrmAyudasGenericas()
        {
            InitializeComponent();
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            #region FJRF - Ponemos el titulo de la ventana
            string strTituloVentana = "";//FJRF - Variaque que contiene el nombre completo del formulario
            if (String.IsNullOrEmpty(pStrTituloVentana_Opcional) == true)//FJRF - Si el titulo de la ventana no tiene datos hacemos lo siguiente
            {
                strTituloVentana = "   AYUDAS GENERICAS" + " - Usuario: " + MDOgeneral.usuario + " - [FrmAyudasGenericas]";//FJRF - Armamos el titulo de la ventana
            }
            else//FJRF - Si el titulo de la ventana tiene datos hacemos lo siguiente
            {
                strTituloVentana = "   " + pStrTituloVentana_Opcional + " - Usuario: " + MDOgeneral.usuario + " - [FrmAyudasGenericas]";//FJRF - Armamos el titulo de la ventana
                TxtTituloFormulario.Text = "   " + pStrTituloVentana_Opcional;
            }
            Title = strTituloVentana;//FJRF - Ponemos el titulo de la ventana
            #endregion

            #region FJRF - Cargamos la informacion que va se va a buscar

            if (pDtDatosRecibidosConInformacion == null)//FJRF - Si no trae datos entonces hacemos lo siguiente
            {
                DtInformacionConsultada = MdoGeneral.consulta(pStrConsultaSql_Obligatorio);//FJRF - Cargamos la consulta
                DtgInformacionConsultada.ItemsSource = DtInformacionConsultada.DefaultView;//FJRF - Cargamos los datos
                StrDataTableCargado = "DtInformacionConsultada";//FJRF - El data table cargado en el grid es este
            }
            else//FJRF - Si no es nulo significa que ha sido cargado entonces le damos prioridad al datable y hacemos lo siguiente
            {
                DtInformacionConsultada = pDtDatosRecibidosConInformacion.Copy();//FJRF - Cargamos la consulta
                DtgInformacionConsultada.ItemsSource = DtInformacionConsultada.DefaultView;//FJRF - Cargamos los datos
                StrDataTableCargado = "DtInformacionConsultada";//FJRF - El data table cargado en el grid es este
            }

            #endregion

            #region FJRF - Cargamos los parametros de busqueda del combo con la informacion encontrada
            int IntCantidadDeColumnas = 0;//FJRF - Contamos las columnas
            if (DtInformacionConsultada.Rows.Count > 0)//FJRF - Si hay datos hacemos lo siguiente
            {
                for (int IntColumnaActual = 0; IntColumnaActual < DtInformacionConsultada.Columns.Count; IntColumnaActual++)//FJRF - Recorremos las columnas
                {
                    String StrNombreColumna = DtInformacionConsultada.Columns[IntColumnaActual].ToString();//FJRF - Extraemos los nombres de las columnas
                    CboBuscarPorEsteDato.Items.Add(StrNombreColumna);//FJRF - Cargamos el combo con los datos
                    IntCantidadDeColumnas++;//FJRF - Sumamos las columnas
                }
                if (String.IsNullOrEmpty(pStrBuscarPorDefectoEnElCampo_Opcional) == true)//FJRF - Si no trae datos entonces hacemos lo siguiente
                {
                    CboBuscarPorEsteDato.SelectedIndex = 0;//FJRF - Ponemos el combo en la primera posicion
                }
                else//FJRF - Si trae datos entonces hacemos lo siguiente
                {
                    CboBuscarPorEsteDato.SelectedItem = pStrBuscarPorDefectoEnElCampo_Opcional;//FJRF - Ponemos la busqueda por defecto en este campo
                }
            }
            #endregion

            #region FJRF - Inmovilizamos el grid en las columnas dadas por el usuario
            if (pIntNumeroColumnasAInmovilizarGrid_Opcional < 0)//FJRF - Si se puso un valor menor a cero entonces hacemos lo siguiente
            {
                pIntNumeroColumnasAInmovilizarGrid_Opcional = 0;//FJRF - Ponemos el valor en cero
            }
            else//FJRF - Si trae un valor real hacemos lo siguiente
            {
                if (pIntNumeroColumnasAInmovilizarGrid_Opcional > IntCantidadDeColumnas)//FJRF - Si el valor dado es mayor al numero de columnas del grid hacemos lo siguiente
                {
                    pIntNumeroColumnasAInmovilizarGrid_Opcional = IntCantidadDeColumnas;//FJRF - Ponemos en maximo de columnas que tiene el grid
                }
            }
            DtgInformacionConsultada.FrozenColumnCount = pIntNumeroColumnasAInmovilizarGrid_Opcional;//FJRF - Inmovilizamos las columnas
            #endregion

            #region FJRF - Aparecer o desaparecer botones
            if (pBooQuitarBotonRetornar_Opcional == true)//FJRF - Si el usuario quiere que se quite el boton entonces hacemos lo siguiente
            {
                LblTituloGridDatosRetornados.Visibility = Visibility.Hidden;//FJRF - Ocultamos el objeto
                DtgDatosRetornados.Visibility = Visibility.Hidden;//FJRF - Ocultamos el objeto
                BtnRetornarDatos.Visibility = Visibility.Hidden;//FJRF - Ocultamos el boton

                DtgInformacionConsultada.Height = 430;//FJRF - Ampliamos el tamaño del grid
            }

            if (pBooPonerBotonExportarExcel_Opcional == false)//FJRF - Si viene en falso hacemos lo siguiente
            {
                BtnExportarAExcel.Visibility = Visibility.Hidden;//FJRF - Ocultamos el boton
            }
            #endregion

            if (String.IsNullOrEmpty(pStrNombreColumnasParaFormatoNumericoSeparadoPorComas_Opcional) == false)//FJRF - Si hay que poner formato a las columnas hacemos lo siguiente
            {
                PttV_FormatoNumericoAColumnasDelGrid(pStrNombreColumnasParaFormatoNumericoSeparadoPorComas_Opcional);//FJRF - Enviamos el nombre de las columnas para que se le de formato numerico
            }

            Double DblDatosEncontrados = DtgInformacionConsultada.Items.Count - 1;
            LblTituloGridInformacionConsultada.Content = "DATOS ENCONTRADOS - [ " + DblDatosEncontrados.ToString() + " - registros ] ";//FJRF - Informamos los datos encontrados

            TxtBuscarDato.Style = null;//FJRF - Le quitamos el estilo para poder controlar el foco
            CboBuscarPorEsteDato.Style = null;//FJRF - Le quitamos el estilo para poder controlar el foco

            TxtBuscarDato.Focus();//FJRF - Ponemos el foco en este objeto
        }
        private void btnSalir_Click(object sender, RoutedEventArgs e)
        {
            StrSalioPor = "btnSalir_Click";//FJRF - Informamos por donde salio

            DtDatosRetornados = null;//FJRF - Limpiamos los datos
            this.Close();//FJRF - Nos salimos del formulario
        }
        private void DtgInformacionConsultada_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            if (e.PropertyType == typeof(System.DateTime))//FJRF - Estas son las columnas que tendran el formato de fecha
            {
                (e.Column as DataGridTextColumn).Binding.StringFormat = "dd/MM/yyyy";//FJRF - Asignamos el formato a la fecha
            }
            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella
        }
        private void DtgDatosRetornados_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            if (e.PropertyType == typeof(System.DateTime))//FJRF - Estas son las columnas que tendran el formato de fecha
            {
                (e.Column as DataGridTextColumn).Binding.StringFormat = "dd/MM/yyyy";//FJRF - Asignamos el formato a la fecha
            }
            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella
        }
        private void TxtBuscarDato_TextChanged(object sender, TextChangedEventArgs e)
        {
            PrivV_Buscar(TxtBuscarDato.Text);//FJRF - Enviamos el dato buscado
        }
        private void PrivV_Buscar(String StrDatoDigitadoABuscar)
        {
            Boolean BooSePudoRealizarLaConsulta = true;//FJRF - Para saber si no se pudo realizar la consulta

            DtgInformacionConsultada.ItemsSource = null;//FJRF - Desvinculamos el objeto
            DtgInformacionConsultada.Items.Clear();//FJRF - Limpiamos los datos

            DtgDatosRetornados.ItemsSource = null;//FJRF - Desvinculamos el objeto
            DtgDatosRetornados.Items.Clear();//FJRF - Limpiamos los datos
            DtDatosRetornados = null;//FJRF - Limpiamos el los datos a retornar
            if (String.IsNullOrEmpty(StrDatoDigitadoABuscar) == true)
            {
                DtgInformacionConsultada.ItemsSource = DtInformacionConsultada.DefaultView;//FJRF - Cargamos el grid con estos datos
                StrDataTableCargado = "DtInformacionConsultada";//FJRF - El data table cargado en el grid es este
            }
            else//FJRF - Si trae datos hacemos lo siguiente
            {
                #region FJRF - Buscamos el dato digitado
                try//FJRF - Controlamos el proceso por si hay un error
                {
                    #region FJRF - Realizamos la busqueda asumiendo que es una consulta tipo String

                    String StrCampoABuscar = CboBuscarPorEsteDato.Text;//FJRF - Extraemos el nombre del campo a buscar
                    EnumerableRowCollection<DataRow> DrNuevosDatos = from TblTmp in DtInformacionConsultada.AsEnumerable()//FJRF - Decimos donde vamos a buscar los datos
                                                                     where TblTmp.Field<string>(StrCampoABuscar).Contains(StrDatoDigitadoABuscar.ToUpper())//FJRF - Decimos que encuentre cualquier dato que coincida con este dato
                                                                     orderby TblTmp.Field<string>(StrCampoABuscar)//FJRF - Lo ordenamos por el mismo campo buscado
                                                                     select TblTmp;//FJRF - Generamos la nueva tabla

                    DataView DvCopiaDeLaTablaFiltrada = DrNuevosDatos.AsDataView();//FJRF - Asignamos los datos encontrados
                    DtFiltrarInformacionConsultada = DvCopiaDeLaTablaFiltrada.ToTable();//FJRF - Convertimos la vista en una tabla
                    DtgInformacionConsultada.ItemsSource = DtFiltrarInformacionConsultada.DefaultView;//FJRF - La asignamos al grid los nuevos datos
                    StrDataTableCargado = "DtFiltrarInformacionConsultada";//FJRF - El data table cargado en el grid es este

                    #endregion
                }
                catch (Exception Ex)//FJRF - Si se presenta un error hacemos lo siguiente
                {
                    if (Ex.Message == "No se puede convertir un objeto de tipo 'System.Double' al tipo 'System.String'.")//FJRF - Si el error es este hacemos lo siguiente
                    {
                        #region FJRF - Realizamos la consulta asumiendo que es un tipo Double
                        try//FJRF - Controlamos el proceso por si hay un error
                        {
                            String StrCampoABuscar = CboBuscarPorEsteDato.Text;//FJRF - Extraemos el nombre del campo a buscar
                            EnumerableRowCollection<DataRow> DrNuevosDatos = from TblTmp in DtInformacionConsultada.AsEnumerable()//FJRF - Decimos donde vamos a buscar los datos
                                                                             where TblTmp.Field<Double>(StrCampoABuscar) == Double.Parse(StrDatoDigitadoABuscar)//FJRF - Decimos que encuentre cuando sea igual al valor digitado
                                                                             orderby TblTmp.Field<Double>(StrCampoABuscar)//FJRF - Lo ordenamos por el mismo campo buscado
                                                                             select TblTmp;//FJRF - Generamos la nueva tabla

                            DataView DvCopiaDeLaTablaFiltrada = DrNuevosDatos.AsDataView();//FJRF - Asignamos los datos encontrados
                            DtFiltrarInformacionConsultada = DvCopiaDeLaTablaFiltrada.ToTable();//FJRF - Convertimos la vista en una tabla
                            DtgInformacionConsultada.ItemsSource = DtFiltrarInformacionConsultada.DefaultView;//FJRF - La asignamos al grid los nuevos datos
                            StrDataTableCargado = "DtFiltrarInformacionConsultada";//FJRF - El data table cargado en el grid es este
                        }
                        catch (Exception ExControladaNumeros)//FJRF - Si se presenta un error hacemos lo siguiente
                        {
                            BooSePudoRealizarLaConsulta = false;//FJRF - Informamos al sistema que no se pudo realizar la consulta
                        }
                        #endregion
                    }
                    else
                    {
                        if (Ex.Message == "No se puede convertir un objeto de tipo 'System.int' al tipo 'System.String'.")//FJRF - Si el error es este hacemos lo siguiente
                        {
                            #region FJRF - Realizamos la consulta asumiendo que es un tipo int
                            try//FJRF - Controlamos el proceso por si hay un error
                            {
                                String StrCampoABuscar = CboBuscarPorEsteDato.Text;//FJRF - Extraemos el nombre del campo a buscar
                                EnumerableRowCollection<DataRow> DrNuevosDatos = from TblTmp in DtInformacionConsultada.AsEnumerable()//FJRF - Decimos donde vamos a buscar los datos
                                                                                 where TblTmp.Field<int>(StrCampoABuscar) == int.Parse(StrDatoDigitadoABuscar)//FJRF - Decimos que encuentre cuando sea igual al valor digitado
                                                                                 orderby TblTmp.Field<int>(StrCampoABuscar)//FJRF - Lo ordenamos por el mismo campo buscado
                                                                                    select TblTmp;//FJRF - Generamos la nueva tabla

                                DataView DvCopiaDeLaTablaFiltrada = DrNuevosDatos.AsDataView();//FJRF - Asignamos los datos encontrados
                                DtFiltrarInformacionConsultada = DvCopiaDeLaTablaFiltrada.ToTable();//FJRF - Convertimos la vista en una tabla
                                DtgInformacionConsultada.ItemsSource = DtFiltrarInformacionConsultada.DefaultView;//FJRF - La asignamos al grid los nuevos datos
                                StrDataTableCargado = "DtFiltrarInformacionConsultada";//FJRF - El data table cargado en el grid es este
                            }
                            catch (Exception ExControladaNumeros)//FJRF - Si se presenta un error hacemos lo siguiente
                            {
                                BooSePudoRealizarLaConsulta = false;//FJRF - Informamos al sistema que no se pudo realizar la consulta
                            }
                            #endregion
                        }
                        else
                        {
                            if (Ex.Message == "No se puede convertir un objeto de tipo 'System.Int16' al tipo 'System.String'.")//FJRF - Si el error es este hacemos lo siguiente
                            {
                                #region FJRF - Realizamos la consulta asumiendo que es un tipo Int16
                                try//FJRF - Controlamos el proceso por si hay un error
                                {
                                    String StrCampoABuscar = CboBuscarPorEsteDato.Text;//FJRF - Extraemos el nombre del campo a buscar
                                    EnumerableRowCollection<DataRow> DrNuevosDatos = from TblTmp in DtInformacionConsultada.AsEnumerable()//FJRF - Decimos donde vamos a buscar los datos
                                                                                     where TblTmp.Field<Int16>(StrCampoABuscar) == Int16.Parse(StrDatoDigitadoABuscar)//FJRF - Decimos que encuentre cuando sea igual al valor digitado
                                                                                     orderby TblTmp.Field<Int16>(StrCampoABuscar)//FJRF - Lo ordenamos por el mismo campo buscado
                                                                                        select TblTmp;//FJRF - Generamos la nueva tabla

                                    DataView DvCopiaDeLaTablaFiltrada = DrNuevosDatos.AsDataView();//FJRF - Asignamos los datos encontrados
                                    DtFiltrarInformacionConsultada = DvCopiaDeLaTablaFiltrada.ToTable();//FJRF - Convertimos la vista en una tabla
                                    DtgInformacionConsultada.ItemsSource = DtFiltrarInformacionConsultada.DefaultView;//FJRF - La asignamos al grid los nuevos datos
                                    StrDataTableCargado = "DtFiltrarInformacionConsultada";//FJRF - El data table cargado en el grid es este
                                }
                                catch (Exception ExControladaNumeros)//FJRF - Si se presenta un error hacemos lo siguiente
                                {
                                    BooSePudoRealizarLaConsulta = false;//FJRF - Informamos al sistema que no se pudo realizar la consulta
                                }
                                #endregion
                            }
                            else
                            {
                                if (Ex.Message == "No se puede convertir un objeto de tipo 'System.Int32' al tipo 'System.String'.")//FJRF - Si el error es este hacemos lo siguiente
                                {
                                    #region FJRF - Realizamos la consulta asumiendo que es un tipo Int32
                                    try//FJRF - Controlamos el proceso por si hay un error
                                    {
                                        String StrCampoABuscar = CboBuscarPorEsteDato.Text;//FJRF - Extraemos el nombre del campo a buscar
                                        EnumerableRowCollection<DataRow> DrNuevosDatos = from TblTmp in DtInformacionConsultada.AsEnumerable()//FJRF - Decimos donde vamos a buscar los datos
                                                                                         where TblTmp.Field<Int32>(StrCampoABuscar) == Int32.Parse(StrDatoDigitadoABuscar)//FJRF - Decimos que encuentre cuando sea igual al valor digitado
                                                                                         orderby TblTmp.Field<Int32>(StrCampoABuscar)//FJRF - Lo ordenamos por el mismo campo buscado
                                                                                            select TblTmp;//FJRF - Generamos la nueva tabla

                                        DataView DvCopiaDeLaTablaFiltrada = DrNuevosDatos.AsDataView();//FJRF - Asignamos los datos encontrados
                                        DtFiltrarInformacionConsultada = DvCopiaDeLaTablaFiltrada.ToTable();//FJRF - Convertimos la vista en una tabla
                                        DtgInformacionConsultada.ItemsSource = DtFiltrarInformacionConsultada.DefaultView;//FJRF - La asignamos al grid los nuevos datos
                                        StrDataTableCargado = "DtFiltrarInformacionConsultada";//FJRF - El data table cargado en el grid es este
                                    }
                                    catch (Exception ExControladaNumeros)//FJRF - Si se presenta un error hacemos lo siguiente
                                    {
                                        BooSePudoRealizarLaConsulta = false;//FJRF - Informamos al sistema que no se pudo realizar la consulta
                                    }
                                    #endregion
                                }
                                else
                                {
                                    if (Ex.Message == "No se puede convertir un objeto de tipo 'System.Int64' al tipo 'System.String'.")//FJRF - Si el error es este hacemos lo siguiente
                                    {
                                        #region FJRF - Realizamos la consulta asumiendo que es un tipo Int64
                                        try//FJRF - Controlamos el proceso por si hay un error
                                        {
                                            String StrCampoABuscar = CboBuscarPorEsteDato.Text;//FJRF - Extraemos el nombre del campo a buscar
                                            EnumerableRowCollection<DataRow> DrNuevosDatos = from TblTmp in DtInformacionConsultada.AsEnumerable()//FJRF - Decimos donde vamos a buscar los datos
                                                                                             where TblTmp.Field<Int64>(StrCampoABuscar) == Int64.Parse(StrDatoDigitadoABuscar)//FJRF - Decimos que encuentre cuando sea igual al valor digitado
                                                                                             orderby TblTmp.Field<Int64>(StrCampoABuscar)//FJRF - Lo ordenamos por el mismo campo buscado
                                                                                             select TblTmp;//FJRF - Generamos la nueva tabla

                                            DataView DvCopiaDeLaTablaFiltrada = DrNuevosDatos.AsDataView();//FJRF - Asignamos los datos encontrados
                                            DtFiltrarInformacionConsultada = DvCopiaDeLaTablaFiltrada.ToTable();//FJRF - Convertimos la vista en una tabla
                                            DtgInformacionConsultada.ItemsSource = DtFiltrarInformacionConsultada.DefaultView;//FJRF - La asignamos al grid los nuevos datos
                                            StrDataTableCargado = "DtFiltrarInformacionConsultada";//FJRF - El data table cargado en el grid es este
                                        }
                                        catch (Exception ExControladaNumeros)//FJRF - Si se presenta un error hacemos lo siguiente
                                        {
                                            BooSePudoRealizarLaConsulta = false;//FJRF - Informamos al sistema que no se pudo realizar la consulta
                                        }
                                        #endregion
                                    }
                                    else
                                    {
                                        if (Ex.Message == "No se puede convertir un objeto de tipo 'System.Decimal' al tipo 'System.String'.")//FJRF - Si el error es este hacemos lo siguiente
                                        {
                                            #region FJRF - Realizamos la consulta asumiendo que es un tipo Decimal
                                            try//FJRF - Controlamos el proceso por si hay un error
                                            {
                                                String StrCampoABuscar = CboBuscarPorEsteDato.Text;//FJRF - Extraemos el nombre del campo a buscar
                                                EnumerableRowCollection<DataRow> DrNuevosDatos = from TblTmp in DtInformacionConsultada.AsEnumerable()//FJRF - Decimos donde vamos a buscar los datos
                                                                                                 where TblTmp.Field<Decimal>(StrCampoABuscar) == Decimal.Parse(StrDatoDigitadoABuscar)//FJRF - Decimos que encuentre cuando sea igual al valor digitado
                                                                                                 orderby TblTmp.Field<Decimal>(StrCampoABuscar)//FJRF - Lo ordenamos por el mismo campo buscado
                                                                                                 select TblTmp;//FJRF - Generamos la nueva tabla

                                                DataView DvCopiaDeLaTablaFiltrada = DrNuevosDatos.AsDataView();//FJRF - Asignamos los datos encontrados
                                                DtFiltrarInformacionConsultada = DvCopiaDeLaTablaFiltrada.ToTable();//FJRF - Convertimos la vista en una tabla
                                                DtgInformacionConsultada.ItemsSource = DtFiltrarInformacionConsultada.DefaultView;//FJRF - La asignamos al grid los nuevos datos
                                                StrDataTableCargado = "DtFiltrarInformacionConsultada";//FJRF - El data table cargado en el grid es este
                                            }
                                            catch (Exception ExControladaNumeros)//FJRF - Si se presenta un error hacemos lo siguiente
                                            {
                                                BooSePudoRealizarLaConsulta = false;//FJRF - Informamos al sistema que no se pudo realizar la consulta
                                            }
                                            #endregion
                                        }
                                        else//FJRF - Si el error no era el anterior entonces hacemos lo siguiente
                                        {
                                            if (Ex.Message == "No se puede convertir un objeto de tipo 'System.DateTime' al tipo 'System.String'.")//FJRF - Si el error es este hacemos lo siguiente
                                            {
                                                #region FJRF - Realizamos la consulta asumiendo que es un tipo DateTime
                                                try//FJRF - Controlamos el proceso por si hay un error
                                                {
                                                    String StrCampoABuscar = CboBuscarPorEsteDato.Text;//FJRF - Extraemos el nombre del campo a buscar
                                                    EnumerableRowCollection<DataRow> DrNuevosDatos = from TblTmp in DtInformacionConsultada.AsEnumerable()//FJRF - Decimos donde vamos a buscar los datos
                                                                                                     where TblTmp.Field<DateTime>(StrCampoABuscar) == DateTime.Parse(StrDatoDigitadoABuscar)//FJRF - Decimos que encuentre cuando sea igual al valor digitado
                                                                                                     orderby TblTmp.Field<DateTime>(StrCampoABuscar)//FJRF - Lo ordenamos por el mismo campo buscado
                                                                                                     select TblTmp;//FJRF - Generamos la nueva tabla

                                                    DataView DvCopiaDeLaTablaFiltrada = DrNuevosDatos.AsDataView();//FJRF - Asignamos los datos encontrados
                                                    DtFiltrarInformacionConsultada = DvCopiaDeLaTablaFiltrada.ToTable();//FJRF - Convertimos la vista en una tabla
                                                    DtgInformacionConsultada.ItemsSource = DtFiltrarInformacionConsultada.DefaultView;//FJRF - La asignamos al grid los nuevos datos
                                                    StrDataTableCargado = "DtFiltrarInformacionConsultada";//FJRF - El data table cargado en el grid es este
                                                }
                                                catch (Exception ExControladaFecha)//FJRF - Si se presenta un error hacemos lo siguiente
                                                {
                                                    BooSePudoRealizarLaConsulta = false;//FJRF - Informamos al sistema que no se pudo realizar la consulta
                                                }
                                                #endregion
                                            }
                                            else//FJRF - Si no tenemos identificado el error entonces hacemos lo siguiente
                                            {
                                                MessageBox.Show(Ex.Message, "PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Informamos al usuario que se presento un error
                                                BooSePudoRealizarLaConsulta = false;//FJRF - Informamos al sistema que no se pudo realizar la consulta
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                #endregion
            }

            if (BooSePudoRealizarLaConsulta == true)//FJRF - Si se pudo realizar la consulta hacemos lo siguiente
            {
                Double DblDatosEncontrados = DtgInformacionConsultada.Items.Count - 1;
                LblTituloGridInformacionConsultada.Content = "DATOS ENCONTRADOS - [ " + DblDatosEncontrados.ToString() + " - registros ] ";//FJRF - Informamos los datos encontrados
            }
            else//FJRF - Si no se pudo realizar la consulta hacemo lo siguiente
            {
                LblTituloGridInformacionConsultada.Content = "DATOS ENCONTRADOS - [ 0 - registros ] ";//FJRF - Informamos los datos encontrados
            }

            if (String.IsNullOrEmpty(pStrNombreColumnasParaFormatoNumericoSeparadoPorComas_Opcional) == false)//FJRF - Si hay que poner formato a las columnas hacemos lo siguiente
            {
                PttV_FormatoNumericoAColumnasDelGrid(pStrNombreColumnasParaFormatoNumericoSeparadoPorComas_Opcional);//FJRF - Enviamos el nombre de las columnas para que se le de formato numerico
            }
        }

        private void DtgInformacionConsultada_KeyUp(object sender, KeyEventArgs e)
        {
            #region FJRF - Saber Fila y Columna indexada

            int IntColumnaIndexada, IntFilaIndexada;
            DependencyObject dep = (DependencyObject)e.OriginalSource;

            //Stepping through the visual tree
            while ((dep != null) && !(dep is System.Windows.Controls.DataGridCell))
            {
                dep = VisualTreeHelper.GetParent(dep);
            }

            //Is the dep a cell or outside the bounds of Window1?
            if (dep == null | !(dep is System.Windows.Controls.DataGridCell))
            {
                return;
            }
            else
            {
                System.Windows.Controls.DataGridCell cell = new System.Windows.Controls.DataGridCell();
                cell = (System.Windows.Controls.DataGridCell)dep;
                while ((dep != null) && !(dep is DataGridRow))
                {
                    dep = VisualTreeHelper.GetParent(dep);
                }

                if (dep == null)
                {
                    return;
                }
                int colindex = cell.Column.DisplayIndex;  //this returns COLUMN INDEX
                IntColumnaIndexada = colindex;

                DataGridRow row = dep as DataGridRow;
                System.Windows.Controls.DataGrid dataGrid = ItemsControl.ItemsControlFromItemContainer(row) as System.Windows.Controls.DataGrid;
                int rowindex = dataGrid.ItemContainerGenerator.IndexFromContainer(row); //this returns ROW INDEX

                IntFilaIndexada = rowindex;
            }
            #endregion

            PrivV_BuscarDatoSeleccionado(IntFilaIndexada, IntColumnaIndexada);//FJRF - Buscamos el dato seleccionado
        }

        private void DtgInformacionConsultada_MouseUp(object sender, MouseButtonEventArgs e)
        {
            #region FJRF - Saber Fila y Columna indexada

            int IntColumnaIndexada, IntFilaIndexada;
            DependencyObject dep = (DependencyObject)e.OriginalSource;

            //Stepping through the visual tree
            while ((dep != null) && !(dep is System.Windows.Controls.DataGridCell))
            {
                dep = VisualTreeHelper.GetParent(dep);
            }

            //Is the dep a cell or outside the bounds of Window1?
            if (dep == null | !(dep is System.Windows.Controls.DataGridCell))
            {
                return;
            }
            else
            {
                System.Windows.Controls.DataGridCell cell = new System.Windows.Controls.DataGridCell();
                cell = (System.Windows.Controls.DataGridCell)dep;
                while ((dep != null) && !(dep is DataGridRow))
                {
                    dep = VisualTreeHelper.GetParent(dep);
                }

                if (dep == null)
                {
                    return;
                }
                int colindex = cell.Column.DisplayIndex;  //this returns COLUMN INDEX
                IntColumnaIndexada = colindex;

                DataGridRow row = dep as DataGridRow;
                System.Windows.Controls.DataGrid dataGrid = ItemsControl.ItemsControlFromItemContainer(row) as System.Windows.Controls.DataGrid;
                int rowindex = dataGrid.ItemContainerGenerator.IndexFromContainer(row); //this returns ROW INDEX

                IntFilaIndexada = rowindex;
            }
            #endregion

            PrivV_BuscarDatoSeleccionado(IntFilaIndexada, IntColumnaIndexada);//FJRF - Buscamos el dato seleccionado
        }
        private void PrivV_BuscarDatoSeleccionado(int IntFila, int IntColumna)
        {
            if (BtnRetornarDatos.Visibility == Visibility.Visible)//FJRF - Si el retornar esta activo hacemos lo siguiente
            {
                String StrDatoSeleccionado = "";//FJRF - Creamos una variable que contiene el dato seleccionado
                DtDatosSeleccionado = new DataTable();//FJRF - Instanciamos un nuevo datatable para los datos
                DtDatosRetornados = new DataTable();//FJRF - Instanciamos un nuevo datatable para los datos

                if (StrDataTableCargado == "DtInformacionConsultada")//FJRF - si el datatable con el que esta trabajando es este hacemos lo siguiente
                {
                    DtDatosSeleccionado = DtInformacionConsultada.Copy();//FJRF - Sacamos una copia de los datos del grid
                }
                else//FJRF - Si no es el datatable correcto entonces hacemos lo siguiente
                {
                    if (StrDataTableCargado == "DtFiltrarInformacionConsultada")//FJRF - si el datatable con el que esta trabajando es este hacemos lo siguiente
                    {
                        DtDatosSeleccionado = DtFiltrarInformacionConsultada.Copy();//FJRF - Sacamos una copia de los datos del grid
                    }
                }
                if (DtDatosSeleccionado == null)//FJRF - Si no hay datos hacemos lo siguiente
                {
                    return;//FJRF - Nos salimos
                }
                else//FJRF - Si hay datos hacemos lo siguiente
                {
                    StrDatoSeleccionado = DtDatosSeleccionado.Rows[IntFila][0].ToString();//FJRF - Buscamos el dato seleccionado
                }
                if (String.IsNullOrEmpty(StrDatoSeleccionado) == true)//FJRF - Si no hay un dato seleccionado hacemos lo siguiente
                {
                    return;//FJRF - Nos salimos
                }
                else//FJRF - Si hay un dato seleccionado hacemos lo siguiente
                {
                    EnumerableRowCollection<DataRow> DrNuevosDatos = from TblTmp in DtDatosSeleccionado.AsEnumerable()//FJRF - Decimos donde vamos a buscar los datos
                                                                     where TblTmp.Field<string>(pStrCampoCodigoDeLaTabla_Obligatorio) == StrDatoSeleccionado.ToUpper()//FJRF - Decimos que encuentre cualquier dato que coincida con este dato
                                                                     select TblTmp;//FJRF - Generamos la nueva tabla

                    DataView DvDatosRetornados = DrNuevosDatos.AsDataView();//FJRF - Asignamos los datos encontrados
                    DtDatosRetornados = DvDatosRetornados.ToTable();//FJRF - Convertimos la vista en una tabla
                    DtgDatosRetornados.ItemsSource = DtDatosRetornados.DefaultView;//FJRF - La asignamos al grid los nuevos datos
                }
            }
        }

        private void CboBuscarPorEsteDato_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)//FJRF - Si el usuario presiona enter entonces hacemos lo siguiente
            {
                TxtBuscarDato.Text = "";//FJRF - Limpiamos los datos
                TxtBuscarDato.Focus();//FJRF - Enviamos el foco al objeto
            }
        }
        private void CboBuscarPorEsteDato_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            TxtBuscarDato.Text = "";//FJRF - Limpiamos los datos
            TxtBuscarDato.Focus();//FJRF - Enviamos el foco al objeto
        }
        private void BtnRetornarDatos_Click(object sender, RoutedEventArgs e)
        {
            if (DtDatosRetornados == null)//FJRF - Si no hay datos hacemos lo siguiente
            {
                MessageBox.Show("No hay datos seleccionados para retornar un dato", "PROCESO CANCELADO",MessageBoxButton.OK,MessageBoxImage.Stop);//FJRF - Enviamos un mensaje al usuario
            }
            else//FJRF - Si tiene algun dato hacemos lo siguiente
            {
                if (DtDatosRetornados.Rows.Count > 0)//FJRF - Si no hay datos hacemos lo siguiente
                {
                    StrSalioPor = "BtnRetornarDatos_Click";//FJRF - Informamos por donde salio
                    this.Close();//FJRF - Nos salimos del formulario
                }
                else//FJRF - Nos salimos con el datatable con datos
                {
                    MessageBox.Show("No hay datos seleccionados para retornar un dato", "PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Enviamos un mensaje al usuario
                }
            }
        }

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (String.IsNullOrEmpty(StrSalioPor) == true)//FJRF - Si no tiene nada significa que salio cerrando la ventana desde la x
            {
                DtDatosRetornados = null;//FJRF - Limpiamos los datos
            }
        }

        private void BtnExportarAExcel_Click(object sender, RoutedEventArgs e)
        {
            if (String.IsNullOrEmpty(TxtBuscarDato.Text) == true)
            {
                PttV_ExportarAExcel(DtInformacionConsultada);
            }
            else//FJRF - Si trae datos hacemos lo siguiente
            {
                PttV_ExportarAExcel(DtFiltrarInformacionConsultada);
            }
        }

        protected void PttV_ExportarAExcel(DataTable dt)
        {
            Microsoft.Office.Interop.Excel.Application excel = null;
            Microsoft.Office.Interop.Excel.Workbook wb = null;

            object missing = Type.Missing;
            Microsoft.Office.Interop.Excel.Worksheet ws = null;

            try
            {
                excel = new Microsoft.Office.Interop.Excel.Application();
                wb = excel.Workbooks.Add();
                ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.ActiveSheet;

                for (int Idx = 0; Idx < dt.Columns.Count; Idx++)
                {
                    ws.Range["A1"].Offset[0, Idx].Value = dt.Columns[Idx].ColumnName;
                }

                for (int Idx = 0; Idx < dt.Rows.Count; Idx++)
                {  // <small>hey! I did not invent this line of code, 
                    // I found it somewhere on CodeProject.</small> 
                    // <small>It works to add the whole row at once, pretty cool huh?</small>
                    ws.Range["A2"].Offset[Idx].Resize[1, dt.Columns.Count].Value =
                    dt.Rows[Idx].ItemArray;
                }
                excel.Visible = true;
                wb.Activate();
            }
            catch (COMException ex)
            {
                MessageBox.Show("Error accessing Excel: " + ex.ToString(),"PROCESO CANCELADO",MessageBoxButton.OK,MessageBoxImage.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.ToString(), "PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
        protected void PttV_FormatoNumericoAColumnasDelGrid(String StrNombreColumnas)
        {
            char[] chrSeparador = new char[] { ',' };//FJRF - Variable que va a contener el separador
            string[] strResultados;//FJRF - La cantidad de datos que se tienen
            String StrNombreColumnaAplicarFormato = "";//FJRF - Nombre de la columna a la cual se le va a aplicar el formato

            strResultados = StrNombreColumnas.Split(chrSeparador, StringSplitOptions.None);//FJRF - Extraemos los datos
            foreach (string strDato in strResultados)//FJRF - Recorremos los datos enviados
            {
                #region FJRF - Extraemos en nombre de la columna
                if (String.IsNullOrEmpty(strDato) == false)//FJRF - Si retorna algun dato hacemos lo siguiente
                {
                    StrNombreColumnaAplicarFormato = strDato;//FJRF - Cargamos el nombre de la columna
                }
                else//FJRF - Si no tiene datos hacemos lo siguiente
                {
                    StrNombreColumnaAplicarFormato = "";//FJRF - Decimos que no hay datos
                }
                #endregion

                if (String.IsNullOrEmpty(StrNombreColumnaAplicarFormato) == false)//FJRF - Si hay datos hacemos lo siguiente
                {
                    #region FJRF - Aplicar formato a la columna
                    if (DtgInformacionConsultada.Items.Count > 0)//FJRF - Si el grid tiene datos hacemos lo siguiente
                    {
                        foreach (var ColumnaGrid in DtgInformacionConsultada.Columns)//FJRF - Recorremos el grid
                        {
                            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
                            strNombreColumna = DtgInformacionConsultada.Columns[ColumnaGrid.DisplayIndex].Header.ToString();//FJRF - Extraemos el titulo que tenga la columna

                            if (strNombreColumna.Trim().ToUpper() == StrNombreColumnaAplicarFormato.Trim().ToUpper())//FJRF - Si alguna de las columnas tiene este nombre hacemos lo siguiente
                            {
                                Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                                MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

                                (ColumnaGrid as DataGridTextColumn).Binding.StringFormat = "{0:##,0;-##,0;  }";//FJRF - Enviamos el formato a la celda pero dejando un blanco si no tiene cero
                                (ColumnaGrid as DataGridTextColumn).CellStyle = MyStyleTextAlignmentProperty;//FJRF - Asignamos el estilo creado

                                break;//FJRF - Como ya aplico el formato a la columna nos salimos
                            }
                        }
                    }
                    #endregion
                }
            }
        }
    }
}
